package com.xbmd.wiki.config;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.annotation.FieldFill;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Collections;

public class CodeGenerator {

    public static void main(String[] args) {
        System.out.println("开始执行代码生成器...");
        
        // 数据库连接配置
        String url = "jdbc:mysql://localhost:3306/wiki?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
        String username = "root";
        String password = "txh131666";
        
        // 验证数据库连接和表
        testDatabaseConnection(url, username, password);

        // 项目路径
        String projectPath = System.getProperty("user.dir");
        System.out.println("项目路径: " + projectPath);
        
        // 当前已经在wiki模块中，不需要额外添加/wiki
        String outputDir = projectPath + "/src/main/java";
        String mapperXmlPath = projectPath + "/src/main/resources/mapper";
        
        System.out.println("代码输出目录: " + outputDir);
        System.out.println("Mapper XML输出目录: " + mapperXmlPath);

        FastAutoGenerator.create(url, username, password)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("xbmd")
                            .outputDir(outputDir)
                            .disableOpenDir();
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.xbmd.wiki")
                            .entity("entity")
                            .service("service")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .controller("controller")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mapperXmlPath));
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("ebook") // 设置需要生成的表名，使用实际存在的表
                            // .addTablePrefix("t_", "sys_", "tbl_") // 设置过滤表前缀

                            // Entity 策略配置
                            .entityBuilder()
                            .enableLombok() // 开启 lombok 模式
                            .enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                            .enableChainModel() // 开启链式模型
                            .logicDeleteColumnName("deleted") // 逻辑删除字段名(数据库)
                            .logicDeletePropertyName("deleteFlag") // 逻辑删除属性名(实体)
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE)) // 添加表字段填充
                            .entityBuilder() // 修复链式调用，重新指定entityBuilder

                            // Controller 策略配置
                            .controllerBuilder()
                            .enableHyphenStyle() // 开启驼峰转连字符
                            .enableRestStyle() // 开启生成@RestController 控制器

                            // Service 策略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService") // 格式化 service 接口文件名称
                            .formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称

                            // Mapper 策略配置
                            .mapperBuilder()
                            .enableBaseResultMap() // 启用 BaseResultMap 生成
                            .enableBaseColumnList(); // 启用 BaseColumnList
                })
                // 使用Velocity引擎模板
                .templateEngine(new VelocityTemplateEngine())
                .execute();
                
        System.out.println("代码生成完成！");
    }
    
    /**
     * 测试数据库连接和表是否存在
     */
    private static void testDatabaseConnection(String url, String username, String password) {
        try {
            System.out.println("正在测试数据库连接...");
            Connection conn = DriverManager.getConnection(url, username, password);
            System.out.println("数据库连接成功！");
            
            // 检查是否有表
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SHOW TABLES");
            
            boolean hasTables = false;
            System.out.println("数据库中的表：");
            while (rs.next()) {
                String tableName = rs.getString(1);
                System.out.println("- " + tableName);
                hasTables = true;
            }
            
            if (!hasTables) {
                System.out.println("警告：数据库中没有找到表！");
            }
            
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            System.err.println("数据库连接测试失败！");
            e.printStackTrace();
        }
    }
}
